package com.coder4j.starter.tools.vo;

import lombok.Data;

import java.util.Date;
import java.util.List;

@Data
public class MonitorVO {
    /**
     * 系统
     */
    OS os;
    /**
     * CPU
     */
    CPU cpu;
    /**
     * 内存
     */
    Memory memory;
    /**
     * 磁盘
     */
    List<MonitorVO.Disk> disks;

    /**
     * JVM
     */
    JVM jvm;

    /**
     * JVM线程
     */
    JVMThread jvmThread;

    /**
     * JVM类加载器
     */
    JVMClassLoad jvmClassLoad;

    /**
     * JVM内存
     */
    JVMMemory jvmMemory;

    /**
     * JVM内存池
     */
    List<JVMMemoryPool> jvmMemoryPools;

    /**
     * JVM GC
     */
    List<JVMGC> jvmgcList;



    @Data
    public static class JVM{
        /**
         * 名称
         */
        String name;
        /**
         * 版本
         */
        String version;
        /**
         * 启动参数
         */
        List<String> inputArguments;
        String classPath;
        /**
         * 启动时间
         */
        Date startTime;
        /**
         * 运行时长 秒
         */
        int runTime;

        String runTimeStr;


    }

    @Data
    public static class JVMMemory{
        /**
         * 最大堆内存
         */
        int maxHeapMemory;
        /**
         * 已用堆内存 MB
         */
        int usedHeapMemory;
        /**
         * 可用堆内存 MB
         */
        int freeHeapMemory;

        /**
         * 堆内存使用率 %
         */
        int heapMemoryLoad;

        /**
         * 已用非堆内存 MB
         */
        int usedNonHeapMemory;
    }

    @Data
    public static class JVMThread{
        /**
         * 活动线程数
         */
        int threadCount;
        /**
         * 守护线程数
         */
        int daemonThreadCount;
        /**
         * 峰值线程数
         */
        int peakThreadCount;
        /**
         * 创建的线程总数
         */
        long totalStartedThreadCount;
    }

    @Data
    public  static class JVMClassLoad{
        /**
         * 已加载的类数量
         */
        int loadedClassCount;
        /**
         * 总加载的类数量
         */
        long totalLoadedThreadCount;
        /**
         * 已卸载的类数量
         */
        long unloadedClassCount;
    }
    @Data
    public static  class JVMMemoryPool{
        /**
         * 内存池名称
         */
        String name;
        /**
         * 类型
         */
        String type;
        /**
         * 初始分配内存 MB
         */
        Integer initSpace;
        /**
         * 最大内存
         */
        Integer maxSpace;
        /**
         * 已用空间
         */
        Integer usedSpace;
        /**
         * 最后一次垃圾回收后最大内存
         */
        Integer collectionMaxSpace;
        /**
         * 最后一次垃圾回收后已用空间
         */
        Integer collectionUsedSpace;
        /**
         * 回收器
         */
        List<String> managers;
    }

    @Data
    public static class JVMGC{
        /**
         * 名称
         */
        String name;
        /**
         * 回收次数
         */
        long collectionCount;
        /**
         * 回收总时间 毫秒
         */
        long collectionTime;
        /**
         * 管理的内存池
         */
        List<String> memoryPoolNames;
    }



    @Data
    public static class CPU{
        /**
         * CPU核心数
         */
        int cpuProcessors;
        /**
         * JVM进程CPU使用率 %
         */
        int processCpuLoad;
        /**
         * 系统CPU使用率
         */
        int systemCpuLoad;
    }

    @Data
    public static class Memory{
        /**
         * 总内存 GB
         */
        int totalMemory;
        /**
         * 已用内存 GB
         */
        int usedMemory;
        /**
         * 空闲内存 GB
         */
        int freeMemory;

        /**
         * 内存使用率
         */
        int memoryLoad;

        /**
         * 总虚拟内存
         */
        int totalVirtualMemory;

        /**
         * 空闲虚拟内存
         */
        int freeVirtualMemory;
        /**
         * 已用虚拟内存
         */
        int usedVirtualMemory;

        /**
         * 虚拟内存使用率
         */
        int virtualMemoryLoad;
    }


    /**
     * 操作系统
     */
    @Data
    public static class OS{
        /**
         * 系统名称 Windows 10
         */
        String name;
        /**
         * 系统版本 10.0
         */
        String version;
        /**
         * 系统架构 amd64
         */
        String arch;
    }

    @Data
    public static class Disk {
        /**
         * 盘符
         */
        String name;
        /**
         * 总空间
         */
        int totalSpace;
        /**
         * 可用空间
         */
        int freeSpace;
        /**
         * 已用空间
         */
        int usedSpace;

        /**
         * 磁盘使用率
         */
        int load;
    }


}
